#include "common.h"
#include <cstdint>
#include <string>
#include <vector>
#include <ostream>
#include <sstream>
#include <thread>
#include <chrono>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#if defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64)
#include <process.h>
#else
#include <unistd.h>
#endif
#include <sys/time.h>



/******************************************************************
 * 功能：判断两个浮点数是否相等
 * 输入参数：
 *      dVal1：比较值1
 *      dVal2：比较值2
 * 返回值：
 *      bool：比较结果，true - 相等，false - 不相等
 * ****************************************************************/
bool isEqual(double dVal1, double dVal2)
{
    return (fabs(dVal1 - dVal2) < 1e-5) ? true : false;
}

/******************************************************************
 * 功能：判断系统是否小端（Intel）序，注网络序和Motorala序为大端序
 * 返回值：
 *      bool：判断结果，true - 小端序，false - 大端序
 * ****************************************************************/
bool isLocalLittleEndian()
{
    int iVal = 0x01;
    char *pVal = (char *)&iVal;
    return (*pVal == 0) ? false : true;
}

/******************************************************************
 * 功能：获取格式化当前系统时间
 * 返回值：
 *      std::string：格式化时间，形如：yyyy-MM-dd HH:mm:ss.zzz
 * ****************************************************************/
std::string getFormatCurSystemTime()
{
    time_t tloc;
    struct tm tm;
    struct timeval tv;

    time(&tloc);
    localtime_r(&tloc, &tm);
    gettimeofday(&tv, nullptr);

    char szTimeInfo[32] = {0};
    snprintf(szTimeInfo, sizeof(szTimeInfo), "%04d-%02d-%02d %02d:%02d:%02d.%03d"
             , tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday
             , tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec / 1000);
    return std::string(szTimeInfo);
}

/******************************************************************
 * 功能：获取当前系统毫秒值的时间戳
 * 返回值：
 *      uint64_t：当前系统毫秒值的时间戳
 * ****************************************************************/
uint64_t getCurSystemMsTime()
{
    return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>
                                 (std::chrono::system_clock::now().time_since_epoch()).count()); // 毫秒
}

/***************************************************************
 * 功能：获取当前进程的PID
 * 返回值：
 *      int：当前进程的PID
 * *************************************************************/
int getCurProcessPID()
{
    return static_cast<int>(getpid());
}

/***************************************************************
 * 功能：获取当前线程的id
 * 返回值：
 *      uint64_t：当前线程的id
 * *************************************************************/
uint64_t getCurrentThreadID()
{
    std::ostringstream oss;
    oss << std::this_thread::get_id();
    std::string stId = oss.str();
    return std::stoull(stId);
}

